#pragma once

#include "ReactorThread.hpp"


//管理所有从属Reactor对象及其线程
class ReactorThreadPool
{
    static const uint32_t DefaultReactorThreadCount = 0;

private:
    // 主Reactor（和主线程绑定的Reactor)，保证即使没有从属Reactor也能工作
    Reactor *_base_reactor;

    // 从属Reactor线程个数
    uint32_t _reactor_thread_count;
    // 保存所有从属Reactor线程
    vector<unique_ptr<ReactorThread>> _reactor_threads;
    // 保存所有从属Reactor
    vector<Reactor *> _reactors;
    // 下一个要分配新连接的从属reactor的下标
    int _next_reactor_idx;

public:
    ReactorThreadPool(Reactor *base_reactor)
        : _reactor_thread_count(DefaultReactorThreadCount),
          _base_reactor(base_reactor),
          _next_reactor_idx(0)
    {
    }
    // 设置从属Reactor线程个数
    void SetSubordReactorThreadCount(uint32_t count)
    {
        _reactor_thread_count = count;
    }

    // 创建并启动所有从属Reactor线程
    void CreateAndStart()
    {
        //如果从属reactor线程个数为0
        if (_reactor_thread_count == 0)
        {
            //那么就只有主线程工作
            return;
        }
        else
        {
            // 创建_reactor_thread_count个reactor线程
            for (int i = 0; i < _reactor_thread_count; i++)
            {
                _reactor_threads.emplace_back(make_unique<ReactorThread>());
            }

            for (int i = 0; i < _reactor_thread_count; i++)
            {
                _reactors.emplace_back(_reactor_threads[i]->GetReactor());
            }
        }
    }
    // 返回下一个要分配新连接的reactor
    Reactor *NeaxReactor()
    {
        //如果从属reactor线程个数为0
        if (_reactor_thread_count == 0)
        {
            //那么就只有主线程工作，那么就把所有新连接都给主Reactor
            return _base_reactor;
        }

        // 保存当前下标
        int index = _next_reactor_idx;
        // 下标移动
        _next_reactor_idx = (_next_reactor_idx + 1) % _reactor_thread_count;

        return _reactors[index];
    }
};